// 使用计时器8（TIM8）输出PWM波形
// 为便于演示，用LCD的背光LED（PC8）作为PWM输出
// 频率定为1Hz，占空比为50%，即LED应该每秒闪烁1次

#include <cupePWM.h>
#include "stm32f1xx_hal.h"

TIM_HandleTypeDef htimx;

// PC8复用为TIM8的CH3通道
void MX_GPIO_Init(void)
{
    __HAL_RCC_GPIOC_CLK_ENABLE();

    // 配置GPIOC8为复用输出模式(即TIM8_CH3)
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

void MX_TIM_Init(void)
{
    // 时钟使能
    __HAL_RCC_TIM8_CLK_ENABLE();

    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};

    htimx.Instance = TIM8;
    htimx.Init.Prescaler = (SystemCoreClock / 10000) - 1;
    htimx.Init.CounterMode = TIM_COUNTERMODE_UP;
    htimx.Init.Period = 10000 - 1; // 1Hz输出
    htimx.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htimx.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    if (HAL_TIM_PWM_Init(&htimx) != HAL_OK)
    {
        // 初始化错误处理
        Error_Handler();
    }

    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    if (HAL_TIM_ConfigClockSource(&htimx, &sClockSourceConfig) != HAL_OK)
    {
        // 时钟源配置错误处理
        Error_Handler();
    }

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 5000; // 50%占空比（如果周期为10000）
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    if (HAL_TIM_PWM_ConfigChannel(&htimx, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
    {
        // PWM通道配置错误处理
        Error_Handler();
    }

    // 开启计时器
    HAL_TIM_PWM_Start(&htimx, TIM_CHANNEL_3);
}

void CupePWM::init() {
    MX_GPIO_Init();
    MX_TIM_Init();
}